package com.xique.park.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xique.park.bean.domain.ParkCar;
import com.xique.park.bean.request.web.parkcar.ParkCarRequest;
import com.xique.park.bean.vo.app.ParkCarVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 车辆Mapper接口
 *
 * @author xique
 * @date 2021-12-09
 */
public interface ParkCarMapper extends RootMapper<ParkCar> {

    /**
     * 校验车场车牌唯一性
     *
     * @param parkCar 车辆信息
     * @return /
     */
    ParkCar checkParkPlateUnique(ParkCar parkCar);

    /**
     * 分页查询车辆列表
     *
     * @param page    分页条件
     * @param request 查询条件
     * @return 车辆集合
     */
    IPage<ParkCarVo> selectParkCarPageList(@Param("page") Page<ParkCarVo> page,
                                           @Param("request") ParkCarRequest request);

    /**
     * 分页查询多位多车列表
     *
     * @param page    分页条件
     * @param request 查询参数
     * @return 分页查询结果
     */
    IPage<ParkCarVo> selectParkCarMultPageList(@Param("page") Page<ParkCarVo> page,
                                               @Param("request") ParkCarRequest request);

    /**
     * 更新车辆的车主ID
     *
     * @param newUserId 新的车主ID
     * @param oldUserId 旧的车主ID
     */
    void updateNewUserIdByOldUserId(@Param("newUserId") Long newUserId,
                                    @Param("oldUserId") Long oldUserId);

    /**
     * 根据管理类型分页查询车辆列表
     *
     * @param page    分页条件
     * @param request 查询条件
     * @return 分页查询结果
     */
    IPage<ParkCarVo> selectListByMngType(@Param("page") Page<ParkCarVo> page,
                                         @Param("request") ParkCarRequest request);

    /**
     * 根据车牌查询车辆信息
     *
     * @param parkId 车场ID
     * @param plate  车牌
     * @return 查询结果
     */
    List<ParkCar> selectListByBindPlates(@Param("parkId") Long parkId,
                                         @Param("plate") String plate);

    /**
     * 查找到了启用日期的车辆信息
     *
     * @param mngType   管理类型
     * @param beginDate 有效期开始时间
     * @return 车辆列表
     */
    List<ParkCar> selectEnableCarList(@Param("mngType") String mngType,
                                      @Param("beginDate") String beginDate);

    /**
     * 查询待导出车辆列表
     *
     * @param parkId 车场ID
     * @return 车辆列表
     */
    List<ParkCar> selectExportCarList(@Param("parkId") Long parkId);

    /**
     * 根据车场ID和车牌查询车辆信息
     *
     * @param parkId 车场ID
     * @param plate  车牌
     * @return 车辆信息
     */
    ParkCar selectParkCarByParkIdAndPlate(@Param("parkId") Long parkId,
                                          @Param("plate") String plate);
}
